{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Использование хаба промптов для суммаризации книг\n",
    "В качестве примера суммаризируем первые две главы книги Булгакова \"Мастер и Маргарита\".\n",
    "## Инициализация GigaChat\n",
    "> Обратите внимание, что нужно использовать большую модель гигачат, поддерживающую 8 тысяч токенов и более!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.prompts import load_prompt\n",
    "from langchain.chains.summarize import load_summarize_chain\n",
    "from langchain.chat_models import GigaChat\n",
    "\n",
    "giga = GigaChat(credentials=..., model=...big_model...)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Суммаризация книг, больших текстов\n",
    "### Загрузка и подготовка данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество частей книги: 11\n"
     ]
    }
   ],
   "source": [
    "from langchain.document_loaders import TextLoader\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "\n",
    "loader = TextLoader(\"../../../../docs/docs/use_cases/мастер_и_маргарита.txt\")\n",
    "documents = loader.load()\n",
    "\n",
    "text_splitter = RecursiveCharacterTextSplitter(\n",
    "    chunk_size = 7000,\n",
    "    chunk_overlap  = 0,\n",
    "    length_function = len,\n",
    "    is_separator_regex = False,\n",
    ")\n",
    "documents = text_splitter.split_documents(documents)\n",
    "print(f\"Количество частей книги: {len(documents)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Создание цепочки суммаризации"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "book_map_prompt = load_prompt(\"lc://prompts/summarize/map_reduce/summarize_book_map.yaml\")\n",
    "book_combine_prompt = load_prompt(\"lc://prompts/summarize/map_reduce/summarize_book_combine.yaml\")\n",
    "\n",
    "chain = load_summarize_chain(giga, chain_type=\"map_reduce\", \n",
    "                             map_prompt=book_map_prompt,\n",
    "                             combine_prompt=book_combine_prompt,\n",
    "                             verbose=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "res = chain.invoke({\"input_documents\": documents})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "В этой части книги рассказывается о двух гражданах, появившихся на Патриарших прудах.\n",
      "Михаил Берлиоз является председателем литературной ассоциации и редактором журнала, а Иван Бездомный — поэт.\n",
      "После того, как они выпили абрикосовую воду, Берлиоз начал говорить о том, что Иисус Христос как личность не существовал, и все рассказы о нем — это миф.\n",
      "\n",
      "В этой части книги описывается встреча Михаила Берлиоза и Ивана Бездомного с загадочным иностранцем, который внимательно слушал их разговор о неверии в бога и доказательствах его существования.\n",
      "После того как иностранный гость узнал о том, что большинство людей в стране не верят в бога, он поблагодарил Берлиоза, что вызвало недоумение у Бездомного.\n",
      "\n",
      "Профессор, представившийся специалистом по черной магии, прибыл в Москву для изучения рукописей чернокнижника Герберта Аврилакского.\n",
      "Он вызвал интерес и недоверие у литераторов, но не стал раскрывать свои истинные намерения.\n",
      "\n",
      "Пилат, прокуратор Иудеи, обсуждает с первосвященником Каифой вопрос о казни Га-Ноцри и Вар-раввана.\n",
      "Несмотря на просьбы Пилата, Каифа отказывается изменить свое решение и освободить Га-Ноцри, что вызывает гнев прокуратора.\n",
      "Пилат чувствует непонятную тоску и думает о бессмертии, которое пришло к нему, но не понимает, чье именно бессмертие он имеет в виду.\n",
      "\n",
      "Пилат вежливо поклонился и остался в саду, когда Каифа вернулся на балкон.\n",
      "Затем он пригласил в сад легата легиона, трибуна когорты, двух членов Синедриона и начальника храмовой стражи.\n",
      "Пилат объявил смертный приговор Иешуа Га-Ноцри и спросил, кого из преступников хотят оставить в живых.\n",
      "После получения ответа, что это Вар-равван, Пилат подтвердил его освобождение.\n"
     ]
    }
   ],
   "source": [
    "print(res[\"output_text\"].replace(\". \", \".\\n\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Если нужно изменить количество предложений в суммаризации, то с помощью дополнительных параметров можно задать нужные объемы текста на этапах map и reduce."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "res = chain.invoke({\"input_documents\": documents, \"map_size\": \"одно предложение\", \"combine_size\": \"три предложения\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "В первой части книги рассказывается о встрече двух литераторов с иностранным путешественником, который предсказывает одному из них страшную судьбу.\n",
      "Во второй части книги описывается беседа прокуратора Иудеи Понтия Пилата с арестованным Иешуа, которого обвиняют в оскорблении величества.\n",
      "Пилат принимает решение не давать делу ход, но из-за опасений возможных волнений в Ершалаиме решает отправить Иешуа в заключение в Кесарию Стратоновой.\n"
     ]
    }
   ],
   "source": [
    "print(res[\"output_text\"].replace(\". \", \".\\n\"))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
